// 泛型就是解决类、接口、方法的复用性，以及对不特定的数据类型的支持（类型校验）

// 定义泛型在方法前面加一个 大写的字母
// 第一个T代表返回值类型
// 第二个第三个都是指定参数类型
T getInfo<T>(T val){
  return val;
}

// 定义泛型类
class P<T>{
  List arr = <T>[];//<指定的参数数据类型>
  void add(T val){
    this.arr.add(val);
  }
  List getArr(){
    return this.arr;
  }
}

// 定义泛型接口
abstract class Cache<T>{
  void getData(T val);
}
// 定义继承接口类
class FileCache<T> implements Cache<T>{
  @override
  void getData(T val) {
    print('约束数据类型${val}');
  }
}

main(){
  print(getInfo<num>(88)); //<指定的参数数据类型>
  print(getInfo<String>('长长久久'));

  // 泛型约束类的数据类型 //在<指定数据类型>
  List list = new List<String>.filled(2, '');
  list[0] = '狗子';
  list[1] = '78';
  print(list);

  // 实例化泛型类
  var p = new P<num>();//<指定的参数数据类型>
  p.add(8);
  print(p.getArr());

  // 实例化泛型接口
  var f = new FileCache<String>();//定义规定的数据类型
  f.getData('字符串');

  var d = new FileCache<Map>();//定义规定的数据类型
  d.getData({'count': 88});
}